#ifndef GRPMONSTRE_INCLUDED
#define GRPMONSTRE_INCLUDED

#include <stdio.h>
#include "perso.h"
/**
 * \file grpmonstre.h
 * \brief Gestion des groupes de monstre
 * \author Nathanaël Desjobert /  Thomas Gauvain
 * \date 20 Avril 2013
 *
 * Programme de gestion de monstre pour le jeu "une retraite en enfer"
 *
 */
/**
    \struct GrpMonstre
    \brief Tableau dynamique regroupant les monstres d'une cellule
**/

struct sGrpMonstre
{
  int tailleutilise;
  int taillemax;
  Perso * Groupe;
  int prempoulemorte;
};
typedef struct sGrpMonstre GrpMonstre;


/** Fonction Get **/

int GetTailleGrpMonstre(GrpMonstre * G);

Perso* GetAdresseMonstre(GrpMonstre * G, int IndiceMonstre);
int GetPointDeVieMonstre(GrpMonstre * G, int IndiceMonstre);
int GetPosintxMonstre(GrpMonstre * G, int IndiceMonstre);
int GetPosintyMonstre(GrpMonstre * G, int IndiceMonstre);
int GetVieMaxMonstre(GrpMonstre * G, int IndiceMonstre);
double GetPosdoubxMonstre(GrpMonstre * G, int IndiceMonstre);
double GetPosdoubyMonstre(GrpMonstre * G, int IndiceMonstre);
char GetEtatMonstre(GrpMonstre * G, int IndiceMonstre);
double GetVectVitessexMonstre(GrpMonstre * G, int IndiceMonstre);
double GetVectVitesseyMonstre(GrpMonstre * G, int IndiceMonstre);
Objet* GetObjetprincipMonstre(GrpMonstre * G, int IndiceMonstre);
Objet* GetObjetsecondMonstre(GrpMonstre * G, int IndiceMonstre);
typepers GetTypeMonstre(GrpMonstre * G, int IndiceMonstre);
int GethitboxxMonstre(GrpMonstre * G, int IndiceMonstre);
int GethitboxyMonstre(GrpMonstre * G, int IndiceMonstre);
int GetVitesseMaxMonstre(GrpMonstre * G, int IndiceMonstre);
float GetTimerMonstre(GrpMonstre * G, int IndiceMonstre);
float GetTimer2Monstre(GrpMonstre * G, int IndiceMonstre);

/** Fonction Set **/


void SethitboxMonstre(GrpMonstre * G, int IndiceMonstre, int x, int y);
void SetVectVitesseMonstre(GrpMonstre * G, int IndiceMonstre, double x, double y);
void SetVieMaxMonstre(GrpMonstre * G, int IndiceMonstre, int pvmax);
void SetPointDeVieMonstre(GrpMonstre * G, int IndiceMonstre, int pv);
void SetPosintxMonstre(GrpMonstre * G, int IndiceMonstre, int x);
void SetPosintyMonstre(GrpMonstre * G, int IndiceMonstre, int y);
void SetPosdoubxMonstre(GrpMonstre * G, int IndiceMonstre, double x);
void SetPosdoubyMonstre(GrpMonstre * G, int IndiceMonstre, double y);
void SetEtatMonstre(GrpMonstre * G, int IndiceMonstre, char Etat);
void SetTypeMonstre(GrpMonstre * G, int IndiceMonstre, typepers T);
void SetVitesseMaxMonstre(GrpMonstre * G, int IndiceMonstre, int VitMax);
void SetTimerMonstre(GrpMonstre * G, int IndiceMonstre);
void SetTimer2Monstre(GrpMonstre * G, int IndiceMonstre);

/** Fonction plus complexe **/

/**
    \brief Fonction d'initialisation d'un groupe de monstre
    \return GrpMonstre *
    \param [in] int taillemax
**/
GrpMonstre * InitGrpMonstre(int taillemax);

/**
    \brief Ajoute un monstre dans le groupe
    \param [in] GrpMonstre * G
    \param [in] Perso * Monstre
**/
void AjouterGrpMonstre(GrpMonstre * G, Perso * Monstre);

/**
    \brief Supprime le monstre d'indice I du groupe
    \param [in] GrpMonstre * G
    \param [in] int IndiceMonstre
**/
void SupprGrpMonstre(GrpMonstre * G, int IndiceMonstre);

/**
    \brief Test si le point x,y est dans un des monstre
    \return int Indice du monstre ayant le point dans sa hitbox ou -1
    \param [in] GrpMonstre * G
    \param [in] int x
    \param [in] int y

    Fonction utile pour les collisions
**/
int PointdansMonstre(GrpMonstre * G,int x, int y);

/**
    \brief met à jour les vecteurs vitesse de chaque monstre du groupe
    \param [in] GrpMonstre * G
    \param [in] float intervalle
**/
void miseajourvectviteGrpMonstre(GrpMonstre * G,float intervalle);

/**
    \brief Fonction de testament du groupe
    \param [in] GrpMonstre * G
**/
void TestamentGrpMonstre(GrpMonstre * G);

/**
    \brief Calcul la position en fonction du vecteur vitesse
    \return double x
    \param [in] GrpMonstre * G
    \param [in] int IndiceMonstre
    \param [in] float intervalle
    */
double nouvellepositionxMonstre(GrpMonstre * G, int IndiceMonstre, float intervalle);

double nouvellepositionyMonstre(GrpMonstre * G, int IndiceMonstre, float intervalle);

/**
    \brief Enleve la vie du monstre d'indice Indicemonstre
    \return Renvois 1 si monstre meurt
    \param [in] GrpMonstre * G
    \param [in] int IndiceMonstre
    \param [in] int perte
**/
int PertedevieMonstre(GrpMonstre* G, int IndiceMonstre, int perte);

#endif
